#include "SymmetricCrypto.h"
#include <stdexcept>
#include <cstring> // memcpy


SymmetricCrypto::SymmetricCrypto() {}

// PKCS#7 填充
std::vector<uint8_t> SymmetricCrypto::pkcs7Pad(const std::vector<uint8_t>& data, size_t blockSize) {
    size_t padLen = blockSize - (data.size() % blockSize);
    std::vector<uint8_t> padded = data;
    padded.insert(padded.end(), padLen, static_cast<uint8_t>(padLen));
    return padded;
}

std::vector<uint8_t> SymmetricCrypto::pkcs7Unpad(const std::vector<uint8_t>& data) {
    if (data.empty()) throw std::runtime_error("Invalid PKCS7 padding");
    uint8_t padLen = data.back();
    if (padLen == 0 || padLen > data.size()) throw std::runtime_error("Invalid PKCS7 padding");
    return std::vector<uint8_t>(data.begin(), data.end() - padLen);
}

// 加密
std::vector<uint8_t> SymmetricCrypto::encrypt(
    const std::vector<uint8_t>& plaintext,
    const std::vector<uint8_t>& key,
    const std::vector<uint8_t>& iv)
{
    // TODO: 在这里调用 SM4-CBC 加密
    // 临时返回：填充后的数据（假装加密了）
    return pkcs7Pad(plaintext, 16);
}

// 解密
std::vector<uint8_t> SymmetricCrypto::decrypt(
    const std::vector<uint8_t>& ciphertext,
    const std::vector<uint8_t>& key,
    const std::vector<uint8_t>& iv)
{
    // TODO: 在这里调用 SM4-CBC 解密
    // 临时返回：去填充的数据（假装解密了）
    return pkcs7Unpad(ciphertext);
}
